# 对象库层
# 维护、管理元素定位方式---->通过实例属性来进行管理
# 定位桌面上所有需要使用的元素对象----> 通过实例方法来进行定位
import allure
from selenium.webdriver.common.by import By

from base.admin.base_page import BasePage


class LoginPage(BasePage):
    def __init__(self):
        super().__init__()
        self.username = (By.NAME, 'username')
        self.password = (By.NAME, 'password')
        self.code = (By.NAME, 'vertify')
        self.login_btn = (By.NAME, 'submit')

    def find_username(self):
        return self.fd_em(self.username)

    def find_password(self):
        return self.fd_em(self.password)

    def find_code(self):
        return self.fd_em(self.code)

    def find_submit(self):
        return self.fd_em(self.login_btn)


# 操作层
class LoginHandle(BasePage):
    def __init__(self):
        super().__init__()
        self.login_page = LoginPage()

    @allure.step("输入用户名")
    def input_username(self, user):
        self.type_ele(self.login_page.find_username(), user)

    @allure.step("输入密码")
    def input_password(self, password):
        self.type_ele(self.login_page.find_password(), password)

    @allure.step("输入验证码")
    def input_code(self, code):
        self.type_ele(self.login_page.find_code(), code)

    @allure.step("点击登录")
    def input_btn(self):
        self.login_page.find_submit().click()


# 业务层:
# 连续调用操作层中定义好多个操作实例方法,形成完整测试用例步骤
class LoginProxy:

    def __init__(self):
        # 不想每次的调用实例方法时都去创建一次操作层的实例对象
        # 那么提前创建好操作层的实例对象并存储的到当前类的实例
        # 属性中方便后续调用
        self.login_handle = LoginHandle()

    # 后台管理系统登陆

    def admin_login(self, user, password, code):
        # 1.输入用户名
        self.login_handle.input_username(user=user)
        # 2.输入密码
        self.login_handle.input_password(password=password)
        # 3.输入验证码
        self.login_handle.input_code(code=code)
        # 4.点击登陆
        self.login_handle.input_btn()
